package com.nature.yanglegeyangultimate.ui;

import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

/**
 * 整个游戏的主界面窗口，原来使用的是JPanel，现在修改使用JFrame作为尝试
 */
public class GameJFrameOriginal extends JFrame {

    //TODO 将所有的内容作为静态常量，将来做配置类的时候方便一些

    //背景颜色
    private static final Color BACKGROUND_COLOR = new Color(195, 254, 139);
    //背景图形颜色
    private static final Color SHAPE_COLOR = new Color(0, 0, 0);

    //窗口的宽高
    private static final int WIDTH = 750;
    private static final int HEIGHT = 800;

    //大圆角矩形的配置信息
    //大圆角矩形的左上角坐标和宽高
    private static final int LARGE_RECT_X = 10; // 起始x坐标
    private static final int LARGE_RECT_Y = 750 - HEIGHT / 4; // 起始y坐标，高度的1/4
    private static final int LARGE_RECT_WIDTH = WIDTH - 80; // 宽度与绿色边界相近
    private static final int LARGE_RECT_HEIGHT = HEIGHT / 6; // 高度为界面高度的1/4
    //大圆角矩形的颜色
    private static final Color LARGE_RECT_COLOR = new Color(139, 69, 19); // 土黄色
    //内部圆角矩形的颜色
    private static final Color INNER_RECT_COLOR = new Color(240, 230, 140);

    //卡牌的宽高设置
    private static final int CARD_WIDTH = 80;
    private static final int CARD_HEIGHT = 100;


    public GameJFrameOriginal() {

        //初始化游戏界面
        initJFrame();

        //初始化界面组件
        initJMenuBar();

        //初始化游戏的背景信息
        initBackground();

        //让界面展示
        this.setVisible(true);
    }

    /**
     * 绘制翻牌区的卡牌
     *
     * @param g2d 绘图对象
     */
    private void drawRoundedRectReverse(Graphics2D g2d, String side) {
        //1.确定左侧翻牌区域的基准点坐标
        int x = side.equals("left") ? LARGE_RECT_X : LARGE_RECT_X + LARGE_RECT_WIDTH - CARD_WIDTH;
        int y = LARGE_RECT_Y - 10 - CARD_HEIGHT;
        //2.获取卡牌的数量 todo 暂时设置为30
        int n = 30;
        //3.获取左侧区域的大小以便获取每一个圆角矩形的左上坐标
        int width = (LARGE_RECT_WIDTH - CARD_WIDTH) / (3 * n);
        //计算左侧卡牌的左上x坐标，y坐标都是一致的
        ArrayList<Integer> xList = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            int tempX = side.equals("left") ? x + i * width : x - i * width;
            xList.add(tempX);
        }
        for (int i = 0; i < n; i++) {
            drawCardRoundedRect(g2d, xList.get(i), y);
        }
    }

    /**
     * 在背景上绘制中心位置的白色圆角矩形
     *
     * @param g2d 绘制图形的对象
     */
    private void drawCardRoundedRect(Graphics2D g2d, int x, int y) {
        Random random = new Random();
        int r = random.nextInt(256);
        int g = random.nextInt(256);
        int b = random.nextInt(256);
        g2d.setColor(new Color(r, g, b)); // 设置随机颜色
        g2d.fillRoundRect(x, y, CARD_WIDTH, CARD_HEIGHT, 20, 20); // 填充圆角矩形
    }

    /**
     * 初始化游戏背景
     */
    private void initBackground() {
        JPanel jPanel = createCustomPanel();
        jPanel.setBackground(BACKGROUND_COLOR);
        // 设置边框
        jPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
        // 没有设置布局的时候要自己设置组件的位置
        jPanel.setBounds(20, 20, 690, 690);
        // 添加到界面组件当中
        this.add(jPanel);
    }

    /**
     * 创建自定义面板，并设置背景颜色
     *
     * @return 返回一个组件对象
     */
    private JPanel createCustomPanel() {
        return new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                try {
                    Graphics2D g2d = (Graphics2D) g;
                    drawShapes(g2d);
                    drawLargeRoundedRect(g2d);
                    drawRoundedRectReverse(g2d, "left");
                    drawRoundedRectReverse(g2d, "right");
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                } finally {
                    if (g instanceof Graphics2D) {
                        ((Graphics2D) g).dispose();
                    }
                }
            }
        };
    }

    /**
     * 在背景上绘制大圆角矩形
     *
     * @param g2d 绘制图形的对象
     */
    private void drawLargeRoundedRect(Graphics2D g2d) {
        g2d.setColor(LARGE_RECT_COLOR); // 设置大圆角矩形的颜色为土黄色
        int x = LARGE_RECT_X; // 起始x坐标
        int y = LARGE_RECT_Y; // 起始y坐标，高度的1/4
        int width = LARGE_RECT_WIDTH; // 宽度与绿色边界相近
        int height = LARGE_RECT_HEIGHT; // 高度为界面高度的1/4
        g2d.fillRoundRect(x, y, width, height, 20, 20); // 填充圆角矩形

        // 绘制小圆角矩形
        g2d.setColor(INNER_RECT_COLOR); // 设置小圆角矩形的颜色为亮黄色
        int innerX = x + 10; // 内部圆角矩形的起始x坐标
        int innerY = y + 10; // 内部圆角矩形的起始y坐标
        int innerWidth = width - 20; // 内部圆角矩形的宽度
        int innerHeight = height - 20; // 内部圆角矩形的高度
        g2d.fillRoundRect(innerX, innerY, innerWidth, innerHeight, 20, 20); // 填充内部圆角矩形
    }

    /**
     * 在背景上绘制图形信息
     *
     * @param g2d 绘制图形的对象
     */
    private void drawShapes(Graphics2D g2d) {
        ThreadLocalRandom random = ThreadLocalRandom.current();
        g2d.setColor(SHAPE_COLOR); // 设置图形颜色为浅绿色

        // 随机绘制100个图形
        for (int i = 0; i < 200; i++) {
            int x = random.nextInt(getWidth());
            int y = random.nextInt(getHeight());
            int width = random.nextInt(20) + 5; // 宽度在5到25之间
            int height = random.nextInt(20) + 5; // 高度在5到25之间

            // 随机选择绘制椭圆、矩形或圆角矩形
            int shapeType = random.nextInt(3);
            switch (shapeType) {
                case 0:
                    g2d.drawOval(x, y, width, height); // 绘制椭圆边框
                    break;
                case 1:
                    g2d.drawRect(x, y, width, height); // 绘制矩形边框
                    break;
                case 2:
                    g2d.drawRoundRect(x, y, width, height, 10, 10); // 绘制圆角矩形边框
                    break;
            }
        }
    }

    /**
     * 初始化功能区组件
     */
    private void initJMenuBar() {
        //创建一些界面的基本组件
        JMenuBar jMenuBar = new JMenuBar();

        //创建两个选项组件
        JMenu function = new JMenu("功能");
        JMenu aboutUs = new JMenu("关于开发者");

        //创建每个小选项组件下的功能选项

        //更换图片选项功能
        JMenu changePicture = new JMenu("更换图片");

        jMenuBar.add(function);
        jMenuBar.add(aboutUs);
        jMenuBar.add(changePicture);

        this.setJMenuBar(jMenuBar);
    }

    /**
     * 初始化游戏界面
     */
    private void initJFrame() {
        //设置界面的宽高
        this.setSize(WIDTH, HEIGHT);
        //设置界面的标题
        this.setTitle("yang-le-ge-yang v1.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        //关闭模式一共有四种状态，可以根据需要进行自己的选择
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //解除界面默认的居中布局设置
        this.setLayout(null);
    }

//    public static void main(String[] args) {
//        new GameJFrameOriginal();
//    }

}
